/**
 * @file EndState.h
 *
 * Estado de fin de juego.
 */

#ifndef __EndState_h__
#define __EndState_h__

#include <cstdlib>
#include <time.h>
#include <vector>
#include <list>
#include <iterator>
#include <Ogre.h>
#include <OIS/OIS.h>
#include <btBulletDynamicsCommon.h>
#include "ZombieManager.h"
#include "StageManager.h"
#include "HumanManager.h"
#include "Human.h"
#include "BtOgrePG.h"
#include "BtOgreGP.h"
#include "BtOgreExtras.h"
#include <TrackManager.h>
#include <SoundFXManager.h>

#include <GameState.h>
// #include "RecordManager.h"

/// Estado de Pausa.
class EndState: public Ogre::Singleton<EndState>, public GameState
{
  public:
    /// Constructor.
    EndState();

    /// Destructor.
    ~EndState() throw();

    /// Se ejecuta al iniciar este estado.
    void enter();

    /// Se ejecuta al salir de este estado.
    void exit();

    /// Se ejecuta al pausar este estado.
    void pause();

    /// Se ejecuta al volver de una pausa desde otro estado.
    void resume();

    /**
     * Detecta cuando se ha pulsado una tecla.
     *
     * @param[in] e Tecla pulsada.
     */
    void keyPressed(const OIS::KeyEvent& e);

    /**
     * Detecta cuando se ha soltado una tecla.
     *
     * @param[in] e Tecla soltada.
     */
    void keyReleased(const OIS::KeyEvent& e);

    /**
     * Detecta cuando se ha movido el ratón.
     *
     * @param[in] e Evento del ratón.
     */
    void mouseMoved(const OIS::MouseEvent& e);

    /**
     * Detecta cuando se ha pulsado un botón del ratón.
     *
     * @param[in] e  Evento del ratón.
     * @param[in] id Botón pulsado.
     */
    void mousePressed(const OIS::MouseEvent& e, OIS::MouseButtonID id);

    /**
     * Detecta cuando se ha soltado un botón del ratón.
     *
     * @param[in] e  Evento del ratón.
     * @param[in] id Botón soltado.
     */
    void mouseReleased(const OIS::MouseEvent& e, OIS::MouseButtonID id);

    /**
     * Se ejecuta cuando se va a renderizar un frame.
     *
     * @param[in] evt Estructura con información acerca del frame.
     */
    virtual bool frameStarted(const Ogre::FrameEvent& evt);

    /**
     * Se ejecuta cuando se ha terminado de renderizar un frame.
     *
     * @param[in] evt Estructura con información acerca del frame.
     */
    virtual bool frameEnded(const Ogre::FrameEvent& evt);

    // Heredados de Ogre::Singleton.

    /// Devuelve una referencia a este singleton.
    static EndState& getSingleton();

    /// Devuelve un puntero a este singleton.
    static EndState* getSingletonPtr();

    /// 0 para game over, 1 para juego ganado.
    void set(const int i);

  private:
    bool _exitGame;
    int _endType;
    Ogre::OverlayManager* _overlayManager;
    SoundFXPtr _win;
    SoundFXPtr _lose;
};

#endif
